/**
 * 数据库连接池管理模块 (v1.0.0)
 * 所属架构层：数据访问层(DAL)
 * 核心职责：
 * - 创建并管理MySQL数据库连接池，实现连接复用
 * - 集中配置数据库连接参数，提供统一的数据访问入口
 * - 隐藏数据库连接细节，为业务层提供简洁的SQL执行接口
 * 技术选型：mysql2模块（替代原生mysql模块）
 * 依赖环境：MySQL 5.7+/8.0+（需提前创建目标数据库my_db_01）
 */

// 导入mysql2模块：Node.js生态中高性能的MySQL客户端
// 技术选型优势：
// 1. 性能优化：相比原生mysql模块，查询速度提升约30%，支持预处理语句缓存
// 2. 功能增强：原生支持Promise API（通过mysql2/promise），便于异步/await语法使用
// 3. 安全强化：默认启用预处理语句，有效抵御SQL注入攻击
// 4. 兼容性：完全兼容mysql模块的API，迁移成本低
const mysql = require('mysql2');

/**
 * 创建MySQL连接池
 * 连接池工作原理：
 * - 初始化时创建指定数量的连接，存放于"连接池"中
 * - 客户端请求时从池内分配空闲连接，使用完毕后归还（而非关闭）
 * - 当连接数不足时，自动创建新连接（不超过max值），减少连接建立开销
 * 
 * 生产环境配置建议：
 * 1. 基础连接参数需通过环境变量注入（如process.env.DB_HOST），禁止硬编码
 * 2. 连接池高级参数配置（根据服务器性能调整）：
 *    - waitForConnections: true（连接不足时排队等待，而非直接报错）
 *    - connectionLimit: 10-20（最大连接数，建议=CPU核心数*2+1，8核CPU推荐17）
 *    - queueLimit: 0（排队请求无上限，避免拒绝服务）
 *    - idleTimeout: 30000（空闲连接回收时间，30秒未使用则关闭）
 */
const db = mysql.createPool({
  host: '127.0.0.1',        // 数据库服务器地址（生产环境需改为私有网络地址或域名）
                            // 建议：使用内网地址（如10.0.0.xxx）避免公网传输风险
  user: 'root',             // 数据库登录用户（生产环境严禁使用root，需创建专用用户）
                            // 安全实践：创建权限最小化用户（仅授予SELECT/INSERT等必要权限）
  password: 'Dy459901',     // 用户密码（生产环境必须通过环境变量注入，如process.env.DB_PWD）
                            // 密码规范：长度≥12位，包含大小写字母+数字+特殊符号，定期轮换
  database: 'my_db_01',     // 目标数据库名（需提前创建并初始化表结构）
                            // 建议：不同环境使用不同数据库（如my_db_dev/test/prod）
  // 生产环境需补充的关键配置
  connectionLimit: 10,      // 最大连接数（默认10，根据并发量调整）
  idleTimeout: 30000,       // 空闲连接超时时间（30秒）
  enableKeepAlive: true,    // 启用TCP长连接，减少握手开销
  keepAliveInitialDelay: 10000 // 长连接心跳间隔（10秒）
});

/**
 * 连接池健康检查（可选）
 * 生产环境建议：启动时验证连接有效性，避免服务启动后无法访问数据库
 */
db.getConnection((err, conn) => {
  if (err) {
    console.error(`[数据库连接失败] 原因：${err.message}`);
    // 生产环境应触发进程退出（通过PM2等工具自动重启）
    // process.exit(1);
  } else {
    console.log('[数据库连接池初始化成功] 可正常执行SQL操作');
    conn.release(); // 释放连接回池
  }
});

/**
 * 导出连接池实例
 * 使用方式：
 * 1. 基础查询：db.query('SELECT * FROM table', (err, results) => { ... })
 * 2. 预处理查询：db.execute('SELECT * FROM table WHERE id = ?', [1], (err, results) => { ... })
 * 3. Promise风格（推荐）：const [results] = await db.promise().query('SELECT * FROM table')
 * 
 * 最佳实践：
 * - 所有SQL操作必须使用参数化查询（?占位符），禁止字符串拼接（防SQL注入）
 * - 复杂查询建议使用事务：conn.beginTransaction() → ... → conn.commit()/rollback()
 * - 大结果集查询需使用流式处理（stream），避免内存溢出
 */
module.exports = db;